# Path relativo al directorio principal del proyecto
DIR_SODIUM_BASE = ..

include $(DIR_SODIUM_BASE)/Makefile.cfg

DIR_SODIUM_BASE = ..

BIN_MBR		= mbr.bin
BIN_BOOTSECTOR	= bootSector.bin
BIN_PBR		= pbr.bin
BIN_LOADER	= loader.sys
BIN_LISTADO	= listado.bin
BIN_KERNEL	= sodium.sys
BIN_USR_L1	= lote1.txt
BIN_KEYMAPS	= keymaps.bin
#Desde este punto, la cantidad de binarios varia segun los .c en /usr y /usr/tst
# REEMPLAZAR SECCION_1
BIN_USR_IDLE= idle.bin #REEMPLAZAR
BIN_USR_INIT= init.bin #REEMPLAZAR
BIN_USR_SHELLUSR= shellusr.bin #REEMPLAZAR
BIN_USR_USUARIO= usuario.bin #REEMPLAZAR
BIN_USR_TST_FLT= tst_flt.bin #REEMPLAZAR
BIN_USR_TST_IPC= tst_ipc.bin #REEMPLAZAR
BIN_USR_TST_MEMA= tst_mema.bin #REEMPLAZAR
BIN_USR_TST_MEMB= tst_memb.bin #REEMPLAZAR
BIN_USR_TST_MEMC= tst_memc.bin #REEMPLAZAR
BIN_USR_TST_MEMD= tst_memd.bin #REEMPLAZAR
BIN_USR_TST_PTRC= tst_ptrc.bin #REEMPLAZAR
BIN_USR_TST_SGNL= tst_sgnl.bin #REEMPLAZAR
BIN_USR_TST_TIME= tst_time.bin #REEMPLAZAR
BIN_USR_PS= ps.bin #REEMPLAZAR




MBR		= $(DIR_MBR)/$(BIN_MBR)
BOOTSECTOR	= $(DIR_SOLO)/$(BIN_BOOTSECTOR)
PBR		= $(DIR_SOLO)/$(BIN_PBR)
LOADER		= $(DIR_SOLO)/$(BIN_LOADER)
LISTADO		= $(DIR_SOLO)/$(BIN_LISTADO)
KERNEL		= $(DIR_KERNEL)/$(BIN_KERNEL)
L1		= $(DIR_USR)/$(BIN_USR_L1)
KEYMAPS		= $(DIR_TECLADO)/$(BIN_KEYMAPS)
#Desde este punto, la cantidad de binarios varia segun los .c en /usr y /usr/tst
# REEMPLAZAR SECCION_2
IDLE	= $(DIR_USR)/$(BIN_USR_IDLE) #REEMPLAZAR
INIT	= $(DIR_USR)/$(BIN_USR_INIT) #REEMPLAZAR
SHELLUSR	= $(DIR_USR)/$(BIN_USR_SHELLUSR) #REEMPLAZAR
USUARIO	= $(DIR_USR)/$(BIN_USR_USUARIO) #REEMPLAZAR
TST_FLT	= $(DIR_USR)/tst/$(BIN_USR_TST_FLT) #REEMPLAZAR
TST_IPC	= $(DIR_USR)/tst/$(BIN_USR_TST_IPC) #REEMPLAZAR
TST_MEMA	= $(DIR_USR)/tst/$(BIN_USR_TST_MEMA) #REEMPLAZAR
TST_MEMB	= $(DIR_USR)/tst/$(BIN_USR_TST_MEMB) #REEMPLAZAR
TST_MEMC	= $(DIR_USR)/tst/$(BIN_USR_TST_MEMC) #REEMPLAZAR
TST_MEMD	= $(DIR_USR)/tst/$(BIN_USR_TST_MEMD) #REEMPLAZAR
TST_PTRC	= $(DIR_USR)/tst/$(BIN_USR_TST_PTRC) #REEMPLAZAR
TST_SGNL	= $(DIR_USR)/tst/$(BIN_USR_TST_SGNL) #REEMPLAZAR
TST_TIME	= $(DIR_USR)/tst/$(BIN_USR_TST_TIME) #REEMPLAZAR
PS	= $(DIR_USR)/bin/$(BIN_USR_PS) #REEMPLAZAR



QEMU		= qemu
BOCHS		= bochs
BXIMAGE		= bximage

MKFS_VFAT	= /sbin/mkfs.vfat
PARTED		= /sbin/parted -s

CYLS		= `awk -F', ' '{split($$4,array,"=");print array[2];}' < $(SODIUM_HDD_CFG)`
HEADS		= `awk -F', ' '{split($$5,array,"=");print array[2];}' < $(SODIUM_HDD_CFG)`
SPT		= `awk -F', ' '{split($$6,array,"=");print array[2];}' < $(SODIUM_HDD_CFG)`

SFDISK		= /sbin/sfdisk -D -C$(CYLS) -H$(HEADS) -S$(SPT)

SODIUM_FDD		= sodium_fdd_test
SODIUM_FDD_IMG		= $(SODIUM_FDD).img
SODIUM_FDD_MKFS		= $(SODIUM_FDD).mkfslog
SODIUM_FDD_IMG_SIZE	= 1474560 # 18SECTORES_POR_TRACK * 80TRACkS_POR_CARA * 2CARAS * 512BYTES_POR_SECTOR

SODIUM_HDD		= sodium_hdd_test
SODIUM_HDD_IMG		= $(SODIUM_HDD).img
SODIUM_HDD_CFG		= $(SODIUM_HDD).cfg
SODIUM_HDD_MKFS		= $(SODIUM_HDD).mkfslog
SODIUM_HDD_IMG_SIZE	= 300 #DADO EN MBYTES #no usar menos de 100 para evitar problemas con el parted y la cantidad de particiones que estamos creando


LANZAR_QEMU	:= $(QEMU) -s -m 16 -localtime -fda $(SODIUM_FDD_IMG)
# -hda $(SODIUM_HDD_IMG)

	#	'keyboard_mapping: enabled=1, map=/usr/share/bochs/keymaps/x11-pc-es.map'\

LANZAR_BOCHS	:= $(BOCHS) -q 'clock: sync=realtime'\
		'floppya: 1_44="$(SODIUM_FDD_IMG)", status=inserted' 'keyboard_type: mf'\
		'vgaromimage: file=/usr/share/vgabios/vgabios.bin' \
		'debug_symbols: file=./simbolos.txt'\
		'magic_break: enabled=1'\
		'log: bochs_dbg.out'\
		'port_e9_hack: enabled=1'
		
		#'display_library: sdl, options="gui_debug"'\
		#'debug: action=report' 'log: bochs_dbg.out'\
		#'plugin_ctrl: iodebug=1'\

		#'vgaromimage: /usr/share/vgabios/vgabios.bin'

BOCHS_EN_GDB_STUB	:='gdbstub: enabled=1, port=1234,text_base=0, data_base=0,bss_base=0'

BIN_MBR_EN_FLOPPY	= $(BIN_MBR)
BIN_PBR_EN_FLOPPY	= $(BIN_PBR)
BIN_KERNEL_EN_FLOPPY	= $(BIN_KERNEL)
BIN_LOADER_EN_FLOPPY	= $(BIN_LOADER)
BIN_LISTADO_EN_FLOPPY	= $(BIN_LISTADO)
BIN_USR_L1_EN_FLOPPY	= $(BIN_USR_L1)
BIN_KEYMAPS_EN_FLOPPY	= $(BIN_KEYMAPS)
#Desde este punto, la cantidad de binarios varia segun los .c en /usr y /usr/tst
# REEMPLAZAR SECCION_3
BIN_USR_IDLE_EN_FLOPPY	= $(BIN_USR_IDLE) #REEMPLAZAR
BIN_USR_INIT_EN_FLOPPY	= $(BIN_USR_INIT) #REEMPLAZAR
BIN_USR_SHELLUSR_EN_FLOPPY	= $(BIN_USR_SHELLUSR) #REEMPLAZAR
BIN_USR_USUARIO_EN_FLOPPY	= $(BIN_USR_USUARIO) #REEMPLAZAR
BIN_USR_TST_FLT_EN_FLOPPY	= $(BIN_USR_TST_FLT) #REEMPLAZAR
BIN_USR_TST_IPC_EN_FLOPPY	= $(BIN_USR_TST_IPC) #REEMPLAZAR
BIN_USR_TST_MEMA_EN_FLOPPY	= $(BIN_USR_TST_MEMA) #REEMPLAZAR
BIN_USR_TST_MEMB_EN_FLOPPY	= $(BIN_USR_TST_MEMB) #REEMPLAZAR
BIN_USR_TST_MEMC_EN_FLOPPY	= $(BIN_USR_TST_MEMC) #REEMPLAZAR
BIN_USR_TST_MEMD_EN_FLOPPY	= $(BIN_USR_TST_MEMD) #REEMPLAZAR
BIN_USR_TST_PTRC_EN_FLOPPY	= $(BIN_USR_TST_PTRC) #REEMPLAZAR
BIN_USR_TST_SGNL_EN_FLOPPY	= $(BIN_USR_TST_SGNL) #REEMPLAZAR
BIN_USR_TST_TIME_EN_FLOPPY	= $(BIN_USR_TST_TIME) #REEMPLAZAR
BIN_USR_PS_EN_FLOPPY	= $(BIN_USR_PS) #REEMPLAZAR



FAT_TOOL = sodium_fat_drv

ALL :=   $(FAT_TOOL) img tags

IMGS = $(SODIUM_HDD_IMG) $(SODIUM_HDD_CFG) $(SODIUM_HDD_MKFS) $(SODIUM_FDD_IMG) $(SODIUM_FDD_MKFS)

all: $(ALL)

SODIUM:
	$(MAKE) -C $(DIR_SODIUM_BASE)
tags:
	$(MAKE) -C $(DIR_SODIUM_BASE) $@

$(FAT_TOOL): sodium_fat_drv.c sodium_fat_drv.h
	$(CC) $< -I . -o $@

$(SODIUM_FDD_IMG): SODIUM
	$(DD) if=/dev/zero of=$(SODIUM_FDD_IMG) bs=$(SODIUM_FDD_IMG_SIZE) count=1
	$(MKFS_VFAT) -v -F12 $(SODIUM_FDD_IMG) > $(SODIUM_FDD_MKFS)

	$(DD) if=$(BOOTSECTOR) of=$(SODIUM_FDD_IMG) "conv=notrunc"
	./$(FAT_TOOL) $(SODIUM_FDD_IMG) $(KERNEL)	$(BIN_KERNEL_EN_FLOPPY)
	./$(FAT_TOOL) $(SODIUM_FDD_IMG) $(MBR)		$(BIN_MBR_EN_FLOPPY)
	./$(FAT_TOOL) $(SODIUM_FDD_IMG) $(PBR)		$(BIN_PBR_EN_FLOPPY)
	./$(FAT_TOOL) $(SODIUM_FDD_IMG) $(BOOTSECTOR)	$(BIN_BOOTSECTOR_EN_FLOPPY)
	./$(FAT_TOOL) $(SODIUM_FDD_IMG) $(LOADER)	$(BIN_LOADER_EN_FLOPPY)
	./$(FAT_TOOL) $(SODIUM_FDD_IMG) $(LISTADO)	$(BIN_LISTADO_EN_FLOPPY)
	./$(FAT_TOOL) $(SODIUM_FDD_IMG) $(L1)		$(BIN_USR_L1)
	./$(FAT_TOOL) $(SODIUM_FDD_IMG) $(KEYMAPS)	$(BIN_KEYMAPS)
	#Desde este punto, la cantidad de binarios varia segun los .c en /usr y /usr/tst
# REEMPLAZAR SECCION_4
	./$(FAT_TOOL) $(SODIUM_FDD_IMG) $(IDLE)	$(BIN_USR_IDLE) #REEMPLAZAR
	./$(FAT_TOOL) $(SODIUM_FDD_IMG) $(INIT)	$(BIN_USR_INIT) #REEMPLAZAR
	./$(FAT_TOOL) $(SODIUM_FDD_IMG) $(SHELLUSR)	$(BIN_USR_SHELLUSR) #REEMPLAZAR
	./$(FAT_TOOL) $(SODIUM_FDD_IMG) $(USUARIO)	$(BIN_USR_USUARIO) #REEMPLAZAR
	./$(FAT_TOOL) $(SODIUM_FDD_IMG) $(TST_FLT)	$(BIN_USR_TST_FLT) #REEMPLAZAR
	./$(FAT_TOOL) $(SODIUM_FDD_IMG) $(TST_IPC)	$(BIN_USR_TST_IPC) #REEMPLAZAR
	./$(FAT_TOOL) $(SODIUM_FDD_IMG) $(TST_MEMA)	$(BIN_USR_TST_MEMA) #REEMPLAZAR
	./$(FAT_TOOL) $(SODIUM_FDD_IMG) $(TST_MEMB)	$(BIN_USR_TST_MEMB) #REEMPLAZAR
	./$(FAT_TOOL) $(SODIUM_FDD_IMG) $(TST_MEMC)	$(BIN_USR_TST_MEMC) #REEMPLAZAR
	./$(FAT_TOOL) $(SODIUM_FDD_IMG) $(TST_MEMD)	$(BIN_USR_TST_MEMD) #REEMPLAZAR
	./$(FAT_TOOL) $(SODIUM_FDD_IMG) $(TST_PTRC)	$(BIN_USR_TST_PTRC) #REEMPLAZAR
	./$(FAT_TOOL) $(SODIUM_FDD_IMG) $(TST_SGNL)	$(BIN_USR_TST_SGNL) #REEMPLAZAR
	./$(FAT_TOOL) $(SODIUM_FDD_IMG) $(TST_TIME)	$(BIN_USR_TST_TIME) #REEMPLAZAR
	./$(FAT_TOOL) $(SODIUM_FDD_IMG) $(PS)	$(BIN_USR_PS) #REEMPLAZAR



$(SODIUM_HDD_IMG):
	rm -f $(SODIUM_HDD_IMG)
	$(BXIMAGE) -q -hd -mode=flat -size=$(SODIUM_HDD_IMG_SIZE) $(SODIUM_HDD_IMG) | tail -1 > $(SODIUM_HDD_CFG)
	$(MKFS_VFAT) -v -F16 $(SODIUM_HDD_IMG) > $(SODIUM_HDD_MKFS)
	$(PARTED) $(SODIUM_HDD_IMG) mklabel msdos

	echo     0,40,,   \\n\
	          ,40,,   \\n\
	          ,40,,   \\n\
	          ,1,13,  | $(SFDISK) -x $(SODIUM_HDD_IMG)

	$(PARTED) $(SODIUM_HDD_IMG) mkfs 1 fat16
	$(PARTED) $(SODIUM_HDD_IMG) mkfs 2 fat16
	$(PARTED) $(SODIUM_HDD_IMG) mkfs 3 fat16

	$(PARTED) $(SODIUM_HDD_IMG) set 1 boot on
	$(PARTED) $(SODIUM_HDD_IMG) set 1 hidden on
	$(PARTED) $(SODIUM_HDD_IMG) set 1 lba off
	$(PARTED) $(SODIUM_HDD_IMG) set 2 lba off
	$(PARTED) $(SODIUM_HDD_IMG) set 3 lba off

	$(PARTED) $(SODIUM_HDD_IMG) print

# WV: Comentado la creacion de imagen de disco, aun faltan unos ajustes.
#img: $(SODIUM_FDD_IMG) $(SODIUM_HDD_IMG)
img: $(SODIUM_FDD_IMG)

qemu_a: all
	$(LANZAR_QEMU) -boot a

qemu_c: all
	$(LANZAR_QEMU) -boot c

qemu_cdrom: all iso
	$(LANZAR_QEMU) -cdrom sodium.iso -boot d


bochs_a: all
	$(LANZAR_BOCHS)	'$(shell cat $(SODIUM_HDD_CFG))' 'boot: floppy'

bochs_c: all
	$(LANZAR_BOCHS)	'$(shell cat $(SODIUM_HDD_CFG))' 'boot: disk'

bochs_cdrom: all iso
	$(LANZAR_BOCHS)	'$(shell cat $(SODIUM_HDD_CFG))' \
        'ata1-master: type=cdrom, path="sodium.iso"' 'boot: cdrom'

bochs_a_gdb: all
	$(LANZAR_BOCHS)	'$(shell cat $(SODIUM_HDD_CFG))' $(BOCHS_EN_GDB_STUB) 'boot: floppy'

bochs_c_gdb: all
	$(LANZAR_BOCHS)	'$(shell cat $(SODIUM_HDD_CFG))' $(BOCHS_EN_GDB_STUB) 'boot: disk'

bochs_cdrom_gdb: all iso
	$(LANZAR_BOCHS)	'$(shell cat $(SODIUM_HDD_CFG))' $(BOCHS_EN_GDB_STUB) \
        'ata1-master: type=cdrom, path="sodium.iso"' 'boot: cdrom'

gdb:
	gdbtui --quiet --ex 'target remote localhost:1234'

clean: clean_img
	$(MAKE) -C $(DIR_SODIUM_BASE) $@
	rm -f $(ALL) *.o *.log tags
	-rm -rf cdrom_iso_tmp

clean_img:
	rm -f $(IMGS)
	-rm -f *.iso
iso: all
	-mkdir cdrom_iso_tmp
	cp $(SODIUM_FDD_IMG) cdrom_iso_tmp/$(SODIUM_FDD_IMG)
	mkisofs -V SODIUM -b $(SODIUM_FDD_IMG) -o sodium.iso cdrom_iso_tmp
	-rm -rf cdrom_iso_tmp

